<?php 
/**
 * Errors Class
 *
 */
class Error {
    private $ob_level;
    private $levels = array(E_ERROR=>'Error', E_WARNING=>'Warning', E_PARSE=>'Parsing Error', E_NOTICE=>'Notice', E_CORE_ERROR=>'Core Error', E_CORE_WARNING=>'Core Warning', E_COMPILE_ERROR=>'Compile Error', E_COMPILE_WARNING=>'Compile Warning', E_USER_ERROR=>'User Error', E_USER_WARNING=>'User Warning', E_USER_NOTICE=>'User Notice', E_STRICT=>'Runtime Notice');
    /**
     * Constructor
     *
     */
    function __construct() {
        /*
         while (ob_get_level()) {
         ob_end_clean();
         }
         */
        $this->ob_level = ob_get_level();
    }
    
    // --------------------------------------------------------------------
    
    /**
     * 404 Page Not Found Handler
     *
     * @access	private
     * @param	string
     * @return	string
     */
    function show_404($msg = '') {
        $heading = "404 Page Not Found";
        $message = "The page you requested was not found.";
        
        $message .= $msg ? $msg : '';
        
        echo $this->show_error($heading, $message);
        exit;
    }
    
    // --------------------------------------------------------------------
    
    /**
     * General Error Page
     *
     * This function takes an error message as input
     * (either as a string or an array) and displays
     * it using the specified template.
     *
     * @access	private
     * @param	string	the heading
     * @param	string	the message
     * @param	string	the template name
     * @return	string
     */
    function show_error($heading, $message, $template = 'page_error', $status_code = 500) {
    	$this->set_status_header($status_code);
        $message = '<p>'.implode('</p><p>', (!is_array($message)) ? array($message) : $message).'</p>';
		
        if (ob_get_level() > $this->ob_level + 1) {
            ob_end_flush();
        }
        ob_start();
        include (CORE_VIEW.$template.EXT);
        $buffer = ob_get_contents();
        ob_end_clean();
        return $buffer;
    }
    
    // --------------------------------------------------------------------
    
    /**
     * Native PHP error handler
     *
     * @access	private
     * @param	string	the error string
     * @param	string	the error filepath
     * @param	string	the error line number
     * @return	string
     */
    function show_php_error($severity, $message, $filepath, $line) {
    
        $severity = (!isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
        
        $filepath = str_replace("\\", "/", $filepath);
        
        // For safety reasons we do not show the full file path
        if (FALSE !== strpos($filepath, '/')) {
            $x = explode('/', $filepath);
            $filepath = $x[count($x) - 2].'/'.end($x);
        }
        if (ob_get_level() > $this->ob_level + 1){
			ob_end_flush();	
		}
        ob_start();
        include (CORE_VIEW.'php_error'.EXT);
        $buffer = ob_get_contents();
        ob_end_clean();
        echo $buffer;
    }
	/**
	 * Set HTTP Status Header
	 *
	 * @access	public
	 * @param	int 	the status code
	 * @param	string	
	 * @return	void
	 */
	function set_status_header($code = 200, $text = '')
	{
		$stati = array(
							200	=> 'OK',
							201	=> 'Created',
							202	=> 'Accepted',
							203	=> 'Non-Authoritative Information',
							204	=> 'No Content',
							205	=> 'Reset Content',
							206	=> 'Partial Content',
	
							300	=> 'Multiple Choices',
							301	=> 'Moved Permanently',
							302	=> 'Found',
							304	=> 'Not Modified',
							305	=> 'Use Proxy',
							307	=> 'Temporary Redirect',
	
							400	=> 'Bad Request',
							401	=> 'Unauthorized',
							403	=> 'Forbidden',
							404	=> 'Not Found',
							405	=> 'Method Not Allowed',
							406	=> 'Not Acceptable',
							407	=> 'Proxy Authentication Required',
							408	=> 'Request Timeout',
							409	=> 'Conflict',
							410	=> 'Gone',
							411	=> 'Length Required',
							412	=> 'Precondition Failed',
							413	=> 'Request Entity Too Large',
							414	=> 'Request-URI Too Long',
							415	=> 'Unsupported Media Type',
							416	=> 'Requested Range Not Satisfiable',
							417	=> 'Expectation Failed',
	
							500	=> 'Internal Server Error',
							501	=> 'Not Implemented',
							502	=> 'Bad Gateway',
							503	=> 'Service Unavailable',
							504	=> 'Gateway Timeout',
							505	=> 'HTTP Version Not Supported'
						);
	
		if ($code == '' OR ! is_numeric($code)){
			$this->show_error('Status codes must be numeric', 500);
		}
	
		if (isset($stati[$code]) AND $text == ''){				
			$text = $stati[$code];
		}
		
		if ($text == ''){
			$this->show_error('No status text available.  Please check your status code number or supply your own message text.', 500);
		}
		
		$server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;
	
		if (substr(php_sapi_name(), 0, 3) == 'cgi'){
			header("Status: {$code} {$text}", TRUE);
		} elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0'){
			header($server_protocol." {$code} {$text}", TRUE, $code);
		} else {
			header("HTTP/1.1 {$code} {$text}", TRUE, $code);
		}
	}
}
